﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpModelInterface.h"
#include "RegenDataId.h"
#include "NdbDataSchema.h"
#include "INoElementIdDbObject.h"

namespace gcmp {
    class ICalculatorCollection;
    class IDocument;

    /// \brief 关联更新行为接口
    class GCMP_MODEL_INTERFACE_EXPORT IElementRegenerationComponent : public INoElementIdDbObject
    {
        DECLARE_CLASS_WITHOUT_DATA_MEMBERS(gcmp, IElementRegenerationComponent, gcmp::INoElementIdDbObject, 9C87D864 - 8939 - 499D - BA72 - BA86067024A0, gcmpmodelinterface);

    public:
        /// \brief 析构函数
        virtual ~IElementRegenerationComponent() {}

        /// \brief 创建IElement关联更新默认行为
        ///
        /// 默认行为中给出了IElementRegenerationComponent中所有接口的默认实现
        /// CanHaveRegenData和CanHaveCalculators返回true，GetCalculators会报告平台内部计算器，见ElementUtils::GetCalculators
        /// \param pElement IElementRegenerationComponent所属的Element指针
        /// \return 关联更新默认行为指针
        static OwnerPtr<IElementRegenerationComponent> CreateDefaultRegenerationComponent();

        /// \brief 创建空的关联更新行为
        /// 
        /// 空的关联更新行为不允许报告计算器
        /// \param pElement IElementRegenerationComponent所属的Element指针
        /// \return 空的关联更新行为指针
        static OwnerPtr<IElementRegenerationComponent> CreateNullRegenerationComponent();

        /// \brief 是否允许有关联更新数据
        ///
        /// 不允许有关联更新数据，则修改此Element任何数据，都不会导致其他数据自动更新
        /// \return 不允许有关联更新数据返回false，否则返回true
        virtual bool CanHaveRegenData() const = 0;

        /// \brief 是否允许报告计算器
        ///
        /// 允许报告计算器，则此类Element可以在关联更新过程中创建，GetCalculators可返回零或多个计算器。
        /// 不允许报告计算器，则此类Element不可以在关联更新过程中创建，GetCalculators不应该返回任何计算器。
        /// \return 允许报告计算器返回true，否则返回false
        virtual bool CanHaveCalculators() const = 0;

        /// \brief 报告当前状态下Element所有的计算器
        ///
        /// GetCalculators中需要调用ICalculatorCollection::AddCalculator(OwnerPtr<ICalculator>)将计算器注册到ICalculatorCollection中。
        /// 若配合ADD_CALCULATOR宏使用，用户重写此方法时形参名也需使用“calculators”。
        /// 外部定制IElementRegenerationComponent，需要累加平台行时，可以调用ElementUtils::GetCalculators
        /// \param calculators 计算器收集器指针
        /// \return void
        virtual void GetCalculators(ICalculatorCollection* calculators) const = 0; //ReportCalculators

    };
}// namespace gcmp


